home *** CD-ROM | disk | FTP | other *** search
/ Developer Helper 1: Phil & Dave's Excellent CD / Excellent CD HFS.raw / Peripherals / MacinTalk / Interfaces / MPW / Better Speech / BSpeechImplementation.a next >
Text File  |  1989-04-13  |  13KB  |  391 lines

  1. ;-------------------------------------------------------------------------------;
  2. ;                                            ;
  3. ;      SpeechGlue -  Interface for PASCAL programs using the                ;
  4. ;                Macintalk speech driver.                    ;
  5. ;                                            ;
  6. ;      Copyright 1984, Joseph Katz / Mark Barton.  Not to be copied or       ;
  7. ;      distributed without the express written permission of the authors.    ;
  8. ;                                            ;
  9. ;      Modification History:                                ;
  10. ;           06/02/85 - Modified only minutes before shipment of software     ;
  11. ;              supplement.  Modified to separate code and data       ;
  12. ;              segments.  This was done in a vast hurry.  There      ;
  13. ;              are no known bugs in it, but it was not done cleanly. ;
  14. ;
  15. ;    04/02/86 Mike Millen    Converted to MPW assembly.
  16. ;    04/05/86 Mike Millen    This version assumes the Macintalk resource is
  17. ;                            either in the System File or the application.
  18. ;    07/24/87 Jordan Mattson    & Brian Wong
  19. ;                            Updated Include definitions for MPW 2.0b1 
  20. ;                                Compatability
  21. ;                                            ;
  22. ;-------------------------------------------------------------------------------;
  23.  
  24.  
  25.           BLANKS    ON
  26.           STRING    ASIS
  27.  
  28.           PRINT     OFF
  29.           INCLUDE   'SysEqu.a'
  30.           INCLUDE   'Traps.a'
  31.           INCLUDE   'SysErr.a'
  32.           INCLUDE   'ToolEqu.a'
  33.            PRINT     ON
  34.  
  35.  
  36. RdrHandle    EQU    52          ;PBLOCK OFFSET OF HANDLE TO READER CODE
  37. RulesFN         EQU    60          ;OFFSET TO READER EXCEPTIONS FILENAME POINTER
  38.  
  39. IDPitchMode  EQU    0
  40. IDRate         EQU    2          ;ID=1 IS USED FOR KILLIO
  41. IDSex         EQU    3          ;RESERVED FOR FUTURE IMPLEMENTATION
  42. IDBaseline   EQU    4
  43.  
  44. fullUnitT    EQU    -4000     ;ERROR CODE FOR DRIVER TABLE FULL
  45.  
  46. Pblock         EQU    0          ;OFFSET TO IOPARMBLOCK
  47. ReaderHandle EQU    66          ;OFFSET TO READER HANDLE
  48. SpeechRfNum  EQU    70          ;OFFSET TO SPEECH DRIVER REFERENCE NUMBER
  49. TalkRefNum   EQU    74          ;OFFSET TO TALK PACKAGE REFNUM (not used)
  50.  
  51.  
  52. ; FUNCTION SpeechOn(EXCPFile: Str255; VAR SpeechHandle: SpeechRecord): SpeechErr;
  53.  
  54. ; Open speech driver. This is complicated by the need to arbitrate the
  55. ; driver unit number, which must be done prior to the actual device open.
  56.  
  57. SpeechOn  FUNC         EXPORT    
  58.  
  59.           MOVE.L    A2,-(SP)            ;SAVE A2 ON STACK
  60.  
  61. ; Try to allocate driver globals area
  62.           MOVE.L    #100,D0                ;GRAB 100 BYTES
  63.           _NewHandle
  64.           MOVE.L    8(SP),A1            ;GET SPEECH RECORD ADDR
  65.           MOVE.L    A0,(A1)                ;SAVE GLOBALS HANDLE
  66.           TST.W        D0
  67.           BNE.S        ONERROR                ;IF ERROR, JUST RETURN
  68.           _HLock                        ;LOCK HANDLE
  69.           MOVE.L    (A0),A2                ;SAVE POINTER TO GLOBALS
  70.  
  71. ; Clear parm block
  72.           MOVEQ        #0,D0
  73.           MOVEQ        #24,D1
  74.           MOVE.L    A2,A0
  75. CLOOP      MOVE.L    D0,(A0)+
  76.           DBF        D1,CLOOP
  77.           
  78. ;No need to open the resfile - it is already open (at least it should be)
  79.  
  80.           BPL.S        GOTRESFILE            ;Assume already open
  81.  
  82. ONERROR      MOVE.L    (SP)+,A2            ;RESTORE A2
  83.           MOVE.L    (SP),8(SP)            ;MOVE RETURN ADDR
  84.           ADDQ.L    #8,SP                ;FIX STACK
  85.           MOVE.W    D0,4(SP)            ;SET RETURN CODE
  86.           RTS                            ;AND GO AWAY
  87.  
  88. GOTRESFILE
  89.  
  90.  
  91. ; Set ResPreLoad to FALSE
  92.  
  93.           MOVE.B    #0,-(SP)
  94.           _SetResLoad
  95.  
  96.  
  97. ; Get handle to synthesizer resource; TYPE = DRVR, NAME=.SPEECH
  98.  
  99.           CLR.L        -(SP)            ;SPACE FOR RETURN CODE
  100.           MOVE.L    #'DRVR',-(SP)       ;RESOURCE TYPE
  101.           PEA        SpeechName            ;RESOURCE NAME
  102.           _GetNamedResource            ;GET DRIVER RESOURCE
  103.           MOVE.L    (SP)+,A1            ;GET HANDLE TO RESOURCE (*** WAS AFTER BNE)
  104.           MOVE.W    ResErr,D0            ;GOOD RETURN?
  105.           BNE.S        ONERROR            ;NO, BRANCH TO ERROR RETURN
  106.  
  107.  
  108. ; Restore ResPreLoad to TRUE
  109.  
  110.           MOVE.B    #1,-(SP)
  111.           _SetResLoad
  112.  
  113.  
  114. ; Find an empty slot in driver unit table (looking backwards from end)
  115.  
  116.           MOVE.L    uTableBase,A0       ;GET DRIVER UNIT TABLE BASE
  117.           ADDA.W    #128,A0            ;START AT END+4 OF UNIT TABLE
  118.           MOVE.W    #32,D0            ;LAST UNIT IN TABLE IS #31
  119.  
  120. @3      SUBQ.W    #1,D0            ;REDUCE SLOT NUMBER
  121.           CMP.W        #18,D0            ;NO FREE SLOTS BELOW UNIT 18
  122.           BGT.S        @4
  123.           MOVE.W    #fullUnitT,D0       ;SETUP ERROR CODE
  124.           BRA.S        ONERROR            ;AND GO AWAY
  125.  
  126. @4      CMPI.L    #0,-(A0)            ;IS SLOT EMPTY?
  127.           BNE.S        @3                ;NO, KEEP LOOPING
  128.  
  129.  
  130. ; Change resource ID to new driver number, and load in resource data
  131.  
  132.           MOVE.W    D0,D1            ;DRIVER NUMBER
  133.           ADDQ.W    #1,D1            ;
  134.           NEG.W        D1                ;REF NUMBER
  135.           MOVE.W    D1,SpeechRfNum(A2)  ;SAVE REFERENCE NUMBER
  136.  
  137.           MOVE.L    A1,-(SP)            ;RESOURCE HANDLE
  138.           MOVE.W    D0,-(SP)            ;NEW DRIVER NUMBER
  139.           MOVE.L    #0,-(SP)            ;DON'T CHANGE THE RESOURCE NAME
  140.           _SetResInfo
  141.  
  142.  
  143.           MOVE.L    A1,-(SP)
  144.           _LoadResource
  145.           MOVE.W    resErr,D0            ;FOR DEBUGGING
  146.  
  147.  
  148.           MOVE.L    A1,A0            ;TRANSFER HANDLE TO A0
  149.           _HLock                ;LOCK DRIVER CODE DOWN
  150.  
  151.  
  152. ; Get SpeechOn input parms from stack
  153.  
  154.           MOVE.L    (SP)+,A2            ;RESTORE A2
  155.           MOVE.L    (SP)+,A0            ;GET RETURN ADDRESS
  156.           MOVE.L    (SP)+,D0            ;GET ADDR OF SPEECHREC HANDLE
  157.           MOVE.L    (SP)+,A1            ;GET EXCPS FILENAME PTR
  158.           MOVE.L    A0,-(SP)            ;RESTORE RETURN ADDR
  159.  
  160.           MOVE.L    A2,-(SP)            ;SAVE A2
  161.           MOVE.L    D0,A2            ;ADDR OF DEV GLOBALS HANDLE
  162.           MOVE.L    (A2),A2            ;DEVICE GLOBALS HANDLE
  163.           MOVE.L    A2,-(SP)            ;SAVE DEVICE GLOBALS HANDLE
  164.           MOVE.L    (A2),A2            ;DEREF TO POINTER
  165.  
  166. ; Build parm block and open the driver
  167.  
  168.           LEA        Pblock(A2),A0       ;A0 --> PARM BLOCK
  169.           MOVE.L    A1,RulesFN(A0)      ;SAVE PTR TO EXCPS FILENAME IN PBLOCK
  170.           LEA        SpeechName,A1       ;A1 --> DRIVER NAME
  171.           MOVE.L    A1,IOFileName(A0)   ;STORE DRIVER NAME IN PARM BLOCK
  172.           CLR.W        IODrvNum(A0)        ;USE DEFAULT DRIVE
  173.           CLR.W        IOFileType(A0)      ;CLEAR TYPE/PERMISSIONS
  174.           CLR.L        IOOwnBuf(A0)        ;USE SYSTEM BUFFER
  175.  
  176.           _Open
  177.           MOVE.W    IOResult(A0),12(SP)            ;SAVE RETURN CODE FROM OPEN
  178.           MOVE.L    RdrHandle(A0),ReaderHandle(A2)  ;SAVE HANDLE TO READER CODE
  179.  
  180.           MOVE.L    (SP)+,A0            ;UNLOCK DEVICE GLOBALS
  181.           _HUnlock
  182.  
  183.           MOVE.L    (SP)+,A2            ;RESTORE A2
  184.           RTS
  185.  
  186.  
  187. SpeechName DC.B     7
  188.            DC.B     '.SPEECH'
  189. DriverID   DC.B     9
  190.            DC.B     'MacinTalk'
  191.  
  192.  
  193.  
  194.  
  195. ;  PROCEDURE SpeechOff(SpeechHandle: SpeechRecord);
  196.  
  197. ;      Closes speech driver.
  198.  
  199. SpeechOff PROC         EXPORT   
  200.  
  201.           MOVE.L    A2,-(SP)            ;SAVE A2
  202.           MOVE.L    8(SP),A0            ;GET DEVICE GLOBALS HANDLE
  203.           _HLock
  204.           MOVE.L    (A0),A2            ;DEREFERENCE TO POINTER
  205.  
  206.           LEA        Pblock(A2),A0       ;POINTER TO PARM BLOCK
  207.           _Close    ,IMMED
  208.  
  209. @1      MOVE.L    8(SP),A0            ;GET DEVICE GLOBALS HANDLE
  210.           _HUnlock                ;UNLOCK IT
  211.           _DisposHandle                ;TOSS IT
  212.           MOVE.L    (SP)+,A2            ;RESTORE A2
  213.           MOVE.L    (SP),4(SP)            ;FIXUP STACK AND RETURN
  214.           ADDQ.L    #4,SP
  215.           RTS
  216.  
  217.  
  218. ;  PROCEDURE SpeechRate(SpeechHandle: SpeechRecord; Rate: Integer);
  219.  
  220. ;      Set the speaking rate in words/minute.  Range and validity
  221. ;      checking is done in SpeechPrime.
  222.  
  223. SpeechRate PROC         EXPORT    
  224.  
  225.           MOVE.L    (SP)+,D1            ;GET RETURN ADDR
  226.           MOVE.W    (SP)+,D2            ;GET RATE PARM
  227.           MOVE.L    (SP)+,A0            ;GET DEVICE GLOBALS
  228.           MOVE.L    D1,-(SP)            ;RESTORE RETURN ADDR
  229.  
  230.           MOVE.L    A0,-(SP)            ;SAVE DEVICE GLOBALS HANDLE
  231.           _HLock                ;LOCK IT
  232.           MOVE.L    (A0),A1            ;DEREF GLOBALS HANDLE
  233.  
  234.           LINK        A6,#-32              ;CREATE PARM BLOCK ON STACK
  235.           LEA        -32(A6),A0              ;POINT A0 AT PARM BLOCK
  236.  
  237.           MOVE.W    SpeechRfNum(A1),IORefNum(A0)  ;SET SPEECH REFNUM
  238.           MOVE.W    #IDRate,CSCode(A0)          ;SET RATE PARM ID
  239.           MOVE.W    D2,CSParam(A0)          ;STORE RATE PARM
  240.  
  241.           _Control  ,IMMED
  242.  
  243.           UNLK        A6                    ;REMOVE DCE FROM STACK
  244.  
  245.           MOVE.L    (SP)+,A0            ;RESTORE DEVICE GLOBALS
  246.           _HUnlock                ;UNLOCK IT
  247.  
  248.           RTS
  249.  
  250.  
  251.  
  252. ;  PROCEDURE SpeechSex(SpeechHandle: SpeechRecord; SpeakerSex: Sex);
  253.  
  254. ;      Set the speaking sex as Male or Female.
  255.  
  256. SpeechSex PROC         EXPORT   
  257.  
  258.           MOVEQ        #0,D2            ;CLEAR
  259.           MOVE.L    (SP)+,D1            ;GET RETURN ADDR
  260.           MOVE.B    (SP)+,D2            ;GET SEX PARM (NOTE .B ON MOVE)
  261.           MOVE.L    (SP)+,A0            ;GET DEVICE GLOBALS
  262.           MOVE.L    D1,-(SP)            ;RESTORE RETURN ADDR
  263.  
  264.           MOVE.L    A0,-(SP)            ;SAVE GLOBALS ON STACK
  265.           _HLock                ;LOCK DEVICE GLOBALS
  266.           MOVE.L    (A0),A1            ;DEREFERENCE TO POINTER
  267.  
  268.           LINK        A6,#-32              ;CREATE PARM BLOCK ON STACK
  269.           LEA        -32(A6),A0              ;POINT A0 AT PARM BLOCK
  270.           MOVE.W    SpeechRfNum(A1),IORefNum(A0)  ;SET SPEECH REFNUM
  271.           MOVE.W    #IDSex,CSCode(A0)          ;SET SEX PARM ID
  272.           MOVE.W    D2,CSParam(A0)          ;STORE SEX PARM
  273.  
  274.           _Control  ,IMMED
  275.  
  276.           UNLK        A6                ;REMOVE PARM BLOCK FROM STACK
  277.  
  278.           MOVE.L    (SP)+,A0            ;RESTORE GLOBALS HANDLE
  279.           _HUnlock                ;UNLOCK HANDLE
  280.  
  281.           RTS
  282.  
  283.  
  284.  
  285. ;  PROCEDURE SpeechPitch(SpeechHandle: SpeechRecord; Pitch: Integer; Mode: F0Mode);
  286.  
  287. ;      Sets the baseline pitch and the F0 mode.  All parameter
  288. ;      validity and range checking is done in SpeechPrime routines.
  289.  
  290. SpeechPitch PROC         EXPORT     
  291.  
  292.           MOVEQ        #0,D2            ;CLEAR THE BUGGER
  293.           MOVE.L    (SP)+,A1            ;GET RETURN ADDR
  294.           MOVE.B    (SP)+,D2            ;GET PITCH MODE
  295.           MOVE.W    (SP)+,D1            ;GET BASELINE PITCH
  296.           MOVE.L    (SP)+,A0            ;GET DEVICE GLOBALS HANDLE
  297.           MOVE.L    A1,-(SP)            ;RESTORE RETURN ADDR
  298.  
  299.           MOVE.L    A0,-(SP)            ;SAVE GLOBALS ON STACK
  300.           _HLock                ;LOCK GLOBALS
  301.           MOVE.L    (A0),A1            ;DEREFERENCE
  302.  
  303.           LINK        A6,#-32            ;CREATE ROOM FOR PARM BLOCK
  304.           LEA        -32(A6),A0
  305.           MOVE.W    SpeechRfNum(A1),IORefNum(A0)
  306.  
  307.           MOVE.W    #IDPitchMode,CSCode(A0)      ;SET MODE ID
  308.           MOVE.W    D2,CSParam(A0)          ;SET PITCH MODE
  309.           _Control  ,IMMED
  310.  
  311.           MOVE.W    #IDBaseline,CSCode(A0)      ;SET BASELINE ID
  312.           MOVE.W    D1,CSPARAM(A0)          ;SET BASELINE PITCH
  313.           _Control  ,IMMED
  314.  
  315.           UNLK        A6
  316.  
  317.           MOVE.L    (SP)+,A0            ;RESTORE GLOBALS HANDLE
  318.           _HUnlock                ;UNLOCK HANDLE
  319.  
  320.           RTS
  321.  
  322.  
  323.  
  324. ;  FUNCTION MacinTalk(SpeechHandle: SpeechRecord; phonemes: Handle): SpeechErr;
  325.  
  326. ;      Macintalk glue passes phonemes handle to speech driver
  327. ;      write routine.
  328.  
  329. MacinTalk FUNC         EXPORT   
  330.  
  331.           MOVE.L    (SP)+,D0            ;GET RETURN ADDR
  332.           MOVE.L    (SP)+,A1            ;GET INPUT HANDLE
  333.           MOVE.L    (SP)+,A0            ;GET DEVICE GLOBALS HANDLE
  334.           MOVE.L    D0,-(SP)            ;RESTORE RETURN ADDR
  335.  
  336.           MOVE.L    A0,-(SP)            ;SAVE ON STACK
  337.           _HLock                ;LOCK GLOBALS HANDLE
  338.  
  339.           MOVE.L    A1,A0            ;COPY INPUT HANDLE TO A0
  340.           _GetHandleSize            ;GET INPUT HANDLE SIZE IN D0
  341.  
  342.           MOVE.L    A2,-(SP)
  343.           MOVE.L    4(SP),A2
  344.           MOVE.L    (A2),A2
  345.  
  346.           LEA        Pblock(A2),A0          ;POINT A0 TO PARM BLOCK
  347.           MOVE.W    SpeechRfNum(A2),IORefNum(A0)  ;STORE REF NUM
  348.           MOVE.L    A1,IOBuffer(A0)          ;STORE INPUT HANDLE
  349.           MOVE.L    D0,IOByteCount(A0)          ;STORE INPUT HANDLE LENGTH
  350.  
  351.           _Write    ,IMMED            ;GO TO IT
  352.  
  353.           MOVE.L    (SP)+,A2            ;RESTORE A2
  354.           MOVE.L    (SP)+,A0            ;RESTORE DEVICE GLOBALS HANDLE
  355.           MOVE.W    D0,-(SP)            ;SAVE WRITE RETURN CODE
  356.           _HUnlock                ;UNLOCK GLOBALS
  357.           MOVE.W    (SP)+,D0            ;RESTORE WRITE RETURN CODE
  358.  
  359.           MOVE.W    D0,4(SP)            ;PUT RETURN CODE ON STACK
  360.           RTS
  361.  
  362.  
  363.  
  364. ; FUNCTION Reader(theSpeech: SpeechHandle;
  365. ;          English: Pointer;
  366. ;          EnglishLen: LongInt;
  367. ;          Output: Handle): Integer;
  368.  
  369.  
  370. Reader    FUNC         EXPORT           ;READER GLUE
  371.  
  372.           MOVE.L    16(SP),A0            ;GET DEVICE GLOBALS HANDLE
  373.           MOVE.L    12(SP),16(SP)
  374.           MOVE.L    8(SP),12(SP)
  375.           MOVE.L    4(SP),8(SP)
  376.           MOVE.L    (SP),4(SP)
  377.           ADDQ.L    #4,SP
  378.  
  379.           _HLock
  380.           MOVE.L    (A0),A0              ;DEREFERENCE GH
  381.           MOVE.L    ReaderHandle(A0),A0          ;GET HANDLE TO READER CODE
  382.           _HLock                  ;LOCK CODE DOWN
  383.  
  384.           MOVE.L    (A0),A0            ;GET PTR TO CODE
  385.           JMP        (A0)            ;GO DO IT
  386.  
  387.           RTS
  388.  
  389.           END 
  390.  
  391.